<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>Extendendo o Zend_Tool - Zend Framework Manual</title>

    <link href="../css/shCore.css" rel="stylesheet" type="text/css" />
    <link href="../css/shThemeDefault.css" rel="stylesheet" type="text/css" />
    <link href="../css/styles.css" media="all" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Zend Framework</h1>
<h2>Programmer's Reference Guide</h2>
<ul>
    <li><a href="../en/zend.tool.extending.html">Inglês (English)</a></li>
    <li><a href="../pt-br/zend.tool.extending.html">Português Brasileiro (Brazilian Portuguese)</a></li>
</ul>
<table width="100%">
    <tr valign="top">
        <td width="85%">
            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.tool.usage.cli.html">Usando Zend_Tool na Linha de Comando</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.tool.html">Zend_Tool</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.tool.framework.html">Zend_Tool_Framework</a></div>
                    </td>
                </tr>
            </table>
<hr />
<div id="zend.tool.extending" class="section"><div class="info"><h1 class="title">Extendendo o Zend_Tool</h1></div>
    

    <div class="section" id="zend.tool.extending.overview"><div class="info"><h1 class="title">Visão Geral do Zend_Tool</h1></div>
        

        <p class="para">
            <span class="classname">Zend_Tool_Framework</span> é uma framework para expor as funcionalidades
            comuns, tais como a criação da estrutura do projeto, geração de código, geração de
            índice de pesquisa, e muito mais. Funcionalmente pode ser escrito e exposto por meio de
            classes <acronym class="acronym">PHP</acronym> dentro do <span class="property">include_path</span> do <acronym class="acronym">PHP</acronym>,
            permitindo uma flexibilidade incrível de implementação. A funcionalidade pode ser consumida
            escrevendo implementação e/ou clientes de protocolo-específico -- tais como clientes console,
            <acronym class="acronym">XML-RPC</acronym>, <acronym class="acronym">SOAP</acronym>, e muito mais.
        </p>

        <p class="para">
            <span class="classname">Zend_Tool_Project</span> desenvolve e amplia os recursos do
            <span class="classname">Zend_Tool_Framework</span> ao de gerenciar um &quot;projeto&quot;. Em geral,
            um &quot;projeto&quot; é um esforço planejado ou uma iniciativa. No mundo da informática, projetos
            em geral são uma coleção de recursos. Esses recursos podem ser arquivos, diretórios,
            bases de dados, esquemas, imagens, estilos e muito mais.
        </p>
    </div>

    <div class="section" id="zend.tool.extending.zend-tool-framework"><div class="info"><h1 class="title">Extensões do Zend_Tool_Framework</h1></div>
        

        <div class="section" id="zend.tool.extending.zend-tool-framework.architecture"><div class="info"><h1 class="title">Arquitetura Geral</h1></div>
            

            <p class="para">
                <span class="classname">Zend_Tool_Framework</span> fornece o seguinte:
            </p>

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">Interfaces comuns e abstratas</em> que permitem a
                        desenvolvedores criar funcionalidades e capacidades que são
                        invocadas por clientes da ferramenta.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">Funcionalidade base de clientes</em> e uma implementação
                        concreta do console que conectam ferramentas externas e interfaces para o
                        Zend_Tool_Framework. O cliente do console pode ser utilizado em ambientes CLI,
                        como console unix e o console do Windows.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">Interfaces de &quot;Provider&quot; e &quot;Manifest&quot;</em> que
                        podem ser usadas pela ferramenta do sistema. &quot;Providers&quot; representam o
                        aspecto functional do framework, e define as ações que os clientes
                        da ferramenta podem chamar. &quot;Manifests&quot; age como registros de metadados
                        que proveem contexto adicional para os vários providers definidos.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">Um sistema de loading introspectivo</em> que irá
                        examinar o ambiente a procura de providers e determinar o que é necessário
                        para chama-los.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">Uma conjunto padrão de sistemas de providers</em> que
                        permite o sistema relatar o que todos os recursos do sistemas são, bem como
                        fornecer um feedback útil. Ele também inclui um compreessível &quot;Systema de Ajuda&quot;.
                    </p>
                </li>
            </ul>

            <p class="para">
                Definições que você deve estar ciente de através deste manual com relação
                ao <span class="classname">Zend_Tool_Framework</span> incluem:
            </p>

            <ul class="itemizedlist">
                <li class="listitem">
                    <p class="para">
                        <span class="classname">Zend_Tool_Framework</span> - O framework que expõe
                        recursos da ferramenta.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">Tooling Client</em> - Uma ferramenta de desenvolvimento que se conecta
                        ao e consome <span class="classname">Zend_Tool_Framework</span>.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">Client</em> - O subsistema do
                        <span class="classname">Zend_Tool_Framework</span> que expoe uma interface tal que
                        tooling clients podem conectar, pesquisar e executar comandos.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">Console Client / Command Line Interface /
                        <var class="filename">zf.php</var></em> - A tooling client para a linha
                        de comando.</p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">Provider</em> - Um subsistema e uma coleção de funcionalidades
                        internas que o framework exporta.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <em class="emphasis">Manifest</em> - Um subsistema para definição,
                        organização, e divulgação de dados exigidos pelo provider.
                    </p>
                </li>

                <li class="listitem">
                    <p class="para">
                        <span class="classname">Zend_Tool_Project</span> Provider - Um conjunto de providers
                        especificamente para criação e manutenção de projetos baseados no Zend Framework.
                    </p>
                </li>
            </ul>
        </div>

        <div class="section" id="zend.tool.extending.zend-tool-framework.cli-client"><div class="info"><h1 class="title">Entendendo o Cliente CLI</h1></div>
            

            <p class="para">
                A <acronym class="acronym">CLI</acronym>, ou ferramenta de linha de comando (internamente
                conhecida como ferramenta de console), é atualmente a interface primária para enviar
                pedidos ao <span class="classname">Zend_Tool</span> requests. Com a ferramenta <acronym class="acronym">CLI</acronym>,
                desenvolvedores podem enviar pedidos para a ferramenta dentro da &quot;janela de linha de comando&quot;, também
                comumente conhecida como janela do &quot;terminal&quot;. Este ambiente é predominante em
                embientes *unix, mas também tem uma implementação comum no Windows como o
                <var class="filename">cmd.exe</var>, console2 e também com o projeto Cygwin.
            </p>

            <div class="section" id="zend.tool.extending.zend-tool-framework.cli-client.setup-general"><div class="info"><h1 class="title">Configuração da ferramenta CLI</h1></div>
                

                <p class="para">
                    Para distribuir pedidos via cliente de linha de comando, primeiro você
                    precisa configurar o cliente para que seu sistema possa manipular os
                    comandos &quot;zf&quot;. O cliente de linha de comando, para todos as intenções e
                    propósitos, é o arquivo <var class="filename">.sh</var> ou <var class="filename">.bat</var>
                    que é provido com a sua distribuição do Zend Framework. No trunk, ele pode ser
                    encontrado aqui:
                    <a href="http://framework.zend.com/svn/framework/standard/trunk/bin/" class="link external">&raquo; http://framework.zend.com/svn/framework/standard/trunk/bin/</a>.
                </p>

                <p class="para">
                    Como você pode ver, existem 3 arquivos no diretório <var class="filename">/bin/</var>:
                    <var class="filename">zf.php</var>, <var class="filename">zf.sh</var>, e
                    <var class="filename">zf.bat</var>. O <var class="filename">zf.sh</var> e o <var class="filename">zf.bat</var>
                    são os pacotes específicos do sistema operacional: <var class="filename">zf.sh</var> para ambientes
                    *nix, e <var class="filename">zf.bat</var> para ambientes Win32. Estes empacotadores clientes são
                    responsáveis por procurar o php.exe correto, achando o <var class="filename">zf.php</var>, e
                    passando o pedido para o cliente. O <var class="filename">zf.php</var>, é responsável por
                    manipular a identificação do seu ambiente, construindo um include_path adequado, e passar o
                    que é fornecido na linha de comando para o componente de biblioteca adequado
                    para a expedição.
                </p>

                <p class="para">
                    Finalmente, você quer garantir duas coisas para fazer tudo funcionar
                    independentemente do sistema operacional em que você está:
                </p>

                <ol type="1">
                    <li class="listitem">
                        <p class="para">
                            <var class="filename">zf.sh/zf.bat</var> acessível a partir do path do sistema.
                            Esta é a capacidade de chamar <strong class="command">zf</strong> de qualquer lugar na sua linha de comando,
                            independentemente de qual é o seu diretório de trabalho atual.
                        </p>
                    </li>

                    <li class="listitem">
                        <p class="para">
                            <var class="filename">ZendFramework/library</var> estar no seu
                            <span class="property">include_path</span>.
                        </p>
                    </li>
                </ol>

                <blockquote class="note"><p><b class="note">Note</b>: 
                    <p class="para">
                        Nota: enquanto os acima são os requisitos ideais, você pode simplesmente
                        baixar o Zend Framework e esperar que ele funcione como <var class="filename">./path/to/zf.php</var>
                        algum comando..
                    </p>
                </p></blockquote>
            </div>

            <div class="section" id="zend.tool.extending.zend-tool-framework.cli-client.setup-starnix"><div class="info"><h1 class="title">Configurando a ferramenta CLI em Sistemas Unix-like</h1></div>
                

                <p class="para">
                    A configuração mais comum no ambiente *nix, é copiar o <var class="filename">zf.sh</var> e
                    o <var class="filename">zf.php</var> no mesmo diretório que o seu binário <acronym class="acronym">PHP</acronym>.
                    Isto pode geralmente ser achado nos seguintes lugares:
                </p>

                <pre class="programlisting brush: text">
/usr/bin
/usr/local/bin
/usr/local/ZendServer/bin/
/Applications/ZendServer/bin/
</pre>


                <p class="para">
                    Para achar a localização do seu binário <acronym class="acronym">PHP</acronym>, você pode executar
                    &#039;which php&#039; na linha de comando. Isto retornará a localização do binário do <acronym class="acronym">PHP</acronym>
                    que você está usando para rodar scripts <acronym class="acronym">PHP</acronym> no seu ambiente.
                </p>

                <p class="para">
                    O próximo passo é certificar que a biblioteca Zend Framework está configurada
                    corretamente dentro do sistema de <span class="property">include_path</span> do
                    <acronym class="acronym">PHP</acronym>. Para achar onde seu <span class="property">include_path</span>
                    está localizado, você pode executar <strong class="command">php -i</strong> e olhar para
                    a variável <span class="property">include_path</span>, o mais sucintamente, executar
                    <strong class="command">php -i | grep include_path</strong>. Uma vez que você tenha achado
                    onde seu <span class="property">include_path</span> está localizado (isto irá geralmente
                    estar em algum lugar como <var class="filename">/usr/lib/php</var>,
                    <var class="filename">/usr/share/php</var>, <var class="filename">/usr/local/lib/php</var>, ou
                    similar), certifique que o conteúdos do diretório <var class="filename">/library/</var>
                    estão colocados dentro do seu diretório <span class="property">include_path</span>
                    especificado.
                </p>

                <p class="para">
                    Uma vez que você tenha terminado estas duas coisas, você deve ser capaz de digitar
                    um comando e obter devolta a resposta adequada como:
                </p>

                <p class="para">
                    <div class="inlinemediaobject"><div class="imageobject"><a href="images/d481d625821a97b9a5eb2cec99dca50e-zend.tool.framework.cliversionunix.png"><img src="images/d481d625821a97b9a5eb2cec99dca50e-zend.tool.framework.cliversionunix.png" alt="zend.tool.framework.cliversionunix.png" width="450" height="247" /></a></div></div>
                </p>

                <p class="para">
                    Se vocÊ não ver isto digitado na saída, volte e verifique sua configuração
                    para ter certeza que tem todas as partes necessárias in devido lugar.
                </p>

                <p class="para">
                    Existem uma combinação de configurações alternativas que você pode querer empregar
                    dependendo das configurações dos servidores, seu nível de acesso, ou
                    por outras razões.
                </p>

                <p class="para">
                   <em class="emphasis">Configuração Alternativa</em> envolve guardar o download do
                   Zend Framework junto como está, e criar um link de um local <b><tt>PATH</tt></b>
                   para o <var class="filename">zf.sh</var>. O que isto significa é que você coloca o conteúdo
                   do download do Zend Framework em uma localização tal como <var class="filename">/usr/local/share/ZendFramework</var>,
                   ou mais localmente como <var class="filename">/home/username/lib/ZendFramework</var>, e cria
                   um link simbólico para o <var class="filename">zf.sh</var>.
                </p>

                <p class="para">
                    Assumindo que você quer colocar o link dentro de <var class="filename">/usr/local/bin</var>
                    (isto pode também funcionar colocando o link dentro de <var class="filename">/home/username/bin/</var>
                    por exemplo) você poderia dgitar um comando similar a este:
                </p>

                <pre class="programlisting brush: sh">
ln -s /usr/local/share/ZendFramework/bin/zf.sh /usr/local/bin/zf

# OU (por exemplo)
ln -s /home/username/lib/ZendFramework/bin/zf.sh /home/username/bin/zf
</pre>


                <p class="para">
                    Isto irá criar um link que você poderá ser capaz de acessar globalmente
                    na linha de comando.
                </p>
            </div>

            <div class="section" id="zend.tool.extending.zend-tool-framework.cli-client.setup-windows"><div class="info"><h1 class="title">Configurando a ferramenta CLI no Windows</h1></div>
                

                <p class="para">
                    A confuguração mais comum no ambiente Win32, é copiar o
                    <var class="filename">zf.bat</var> e o <var class="filename">zf.php</var> para dentr do mesmo
                    diretório do seu binário <acronym class="acronym">PHP</acronym>. Este pode geralmente ser achado
                    nos seguintes lugares:
                </p>

                <pre class="programlisting brush: text">
C:\PHP
C:\Program Files\ZendServer\bin\
C:\WAMP\PHP\bin
</pre>


                <p class="para">
                    Você deve ser capaz de rodar <var class="filename">php.exe</var> na linha de comando.
                    Se você não for capaz, primeiro verifique a documentação que veio com sua
                    distribuição <acronym class="acronym">PHP</acronym>, ou tenha certeza que o caminho para o
                    <var class="filename">php.exe</var> está na sua variável de ambiente
                    <b><tt>PATH</tt></b> do Windows.
                </p>

                <p class="para">
                    O próximo passo é ter certeza que a biblioteca do Zend Framework
                    está configurada corretamente dentro do sistema de <span class="property">include_path</span>
                    do <acronym class="acronym">PHP</acronym>. Para achar onde seu <span class="property">include_path</span>
                    está localizado, você pode digitar <strong class="command">php -i</strong> e olhar para a
                    variável <span class="property">include_path</span>, ou mais sucintamente executar
                    <strong class="command">php -i | grep include_path</strong> se você tem um Cygwin configurado
                    com grep disponível. Uma vez você tenha achado onde seu <span class="property">include_path</span>
                    está localizado(isto irá geralmente ser algo como <var class="filename">C:\PHP\pear</var>,
                    <var class="filename">C:\PHP\share</var>,<var class="filename">C:\Program%20Files\ZendServer\share</var>
                    ou similar), verifique que os conteúdos do diretório library/ estão postos dentro
                    do seu diretório <span class="property">include_path</span>especificado.
                </p>

                <p class="para">
                    Uma vez tenha terminado aquilas duas coisas, você deve ser capaz de enviar um
                    comando e receber o devida resposta como:
                </p>

                <p class="para">
                    <div class="inlinemediaobject"><div class="imageobject"><a href="images/d481d625821a97b9a5eb2cec99dca50e-zend.tool.framework.cliversionwin32.png"><img src="images/d481d625821a97b9a5eb2cec99dca50e-zend.tool.framework.cliversionwin32.png" alt="zend.tool.framework.cliversionwin32.png" width="450" height="306" /></a></div></div>
                </p>

                <p class="para">
                    Se você não ver isto digitado na saída, volte e verifique sua configuração
                    para ter certeza que você tem todas as partes necessárias no lugar correto.
                </p>

                <p class="para">
                    Existe uma combinação de configurações alternativas que você pode querer empregar
                    dependendo das configurações do seu servidor, do seu nível de acesso, ou de
                    outras razões.
                </p>

                <p class="para">
                    <em class="emphasis">Configuração Alternativa</em> envolve guardar o download do
                    Zend Framework junto como está, e alterar ambos seu sistema de <b><tt>PATH</tt></b>
                    bem como o arquivo <var class="filename">php.ini</var>. No seu ambiente de usuário,
                    tenha certeza de adcionar <var class="filename">C:\Path\To\ZendFramework\bin</var>,
                    então seu arquivo <var class="filename">zf.bat</var> será executável. Também, altere
                    o arquivo <var class="filename">php.ini</var> certificando que
                    <var class="filename">C:\Path\To\ZendFramework\library</var> está no seu
                    <span class="property">include_path</span>.
                </p>
            </div>

            <div class="section" id="zend.tool.extending.zend-tool-framework.cli-client.setup-othernotes"><div class="info"><h1 class="title">Outras Considerações de Configuração</h1></div>
                

                <p class="para">
                    Se por alguma razão você não quiser a biblioteca do Zend Framework dentro
                    do seu <span class="property">include_path</span>, existe uma outra opção. Existem
                    duas variáveis de ambiente especiais que o <var class="filename">zf.php</var> irá
                    utilizar para determinar a localização da sua instalação do Zend Framework.
                </p>

                <p class="para">
                    A primeira é <b><tt>ZEND_TOOL_INCLUDE_PATH_PREPEND</tt></b>, que irá
                    preceder o valor da variável de ambiente para o sistema de (<var class="filename">php.ini</var>)
                    <span class="property">include_path</span> <span class="property">include_path</span> antes
                    da carga do cliente.
                </p>

                <p class="para">
                    Alternativamente, você pode querer usar <b><tt>ZEND_TOOL_INCLUDE_PATH</tt></b>
                    para <em class="emphasis">substituir</em> completamente o sistema de
                    <span class="property">include_path</span> para um que faça sentido especialmente para
                    a ferramente de linha de comando <strong class="command">zf</strong>.
                </p>
            </div>
        </div>

        <div class="section" id="zend.tool.extending.zend-tool-framework.providers-and-manifests"><div class="info"><h1 class="title">Criando Providers</h1></div>
            

            <p class="para">
                Em geral, um provider, por si só, é nada mais que o a casca para um
                desenvolvedor para agrupar-se algumas das capacidades que eles desejam
                enviar com um o cliente de linha de comando (ou outro). Ele é um análogo
                para o que um &quot;controller&quot; é dentro da sua aplicação <acronym class="acronym">MVC</acronym>.
            </p>

            <div class="section" id="zend.tool.extending.zend-tool-framework.providers-and-manifests.loading"><div class="info"><h1 class="title">Como o Zend_Tool encontra seus Providers</h1></div>
                

                <p class="para">
                    Por padrão <span class="classname">Zend_Tool</span> usa o BasicLoader para encontrar
                    todos os providers que você pode rodar. Ele itera recursivamente todos
                    os diretórios do include path e abre todos os arquivos que terminam
                    com &quot;Manifest.php&quot; ou &quot;Provider.php&quot;. Todas as classes naqueles arquivos
                    são inspecionadas se implementam ou <span class="classname">Zend_Tool_Framework_Provider_Interface</span>
                    ou <span class="classname">Zend_Tool_Framework_Manifest_ProviderManifestable</span>.
                    Instancias da interface do provider implementam a real funcionalidade e
                    todos os métodos públicos estão acessíveis como actions do provider.
                    A interface ProviderManifestable de qualquer forma requer a implementação de um
                    metodo  <span class="methodname">getProviders()</span> que reforna um array de
                    instâncias da interface provider.
                </p>

                <p class="para">
                    As seguintes regras de nomeação aplicaveis em como você pode acessar os providers
                    que foram encontrados pelo IncludePathLoader:
                </p>

                <ul class="itemizedlist">
                    <li class="listitem">
                        <p class="para">
                            A última parte da sua divisão do classname por underscore é usado
                            para o nome do provedor, por exemplo, &quot;My_Provider_Hello&quot; permite ao seu
                            provider a ser acessível pelo nome de &quot;hello&quot;.
                        </p>
                    </li>

                    <li class="listitem">
                        <p class="para">
                            Se o seu provider tem um método  <span class="methodname">getName()</span>
                            ele irá ser usado ao invés da maneira anterior para determinar
                            o nome.
                        </p>
                    </li>

                    <li class="listitem">
                        <p class="para">
                            Se o seu provider tem um prefixo &quot;Provider&quot;, por exemplo ele é chamado
                            de <span class="classname">My_HelloProvider</span>, isto será retirado
                            do nome, assim o provider será chamado &quot;hello&quot;.
                        </p>
                    </li>
                </ul>

                <blockquote class="note"><p><b class="note">Note</b>: 
                    <p class="para">O IncludePathLoader não permite links simbólicos, que significa
                    que você não pode linkar funcionalmente o provider no seus inclide paths,
                    eles tem que estar fisicamente presentes nos inclide paths.</p>
                </p></blockquote>

                <div class="example" id="zend.tool.extending.zend-tool-framework.providers-and-manifests.loading.example"><div class="info"><p><b>Example #1 Expondo Seus Providers com um Manifest</b></p></div>
                    

                    <div class="example-contents"><p>
                        Você pode expor seus providers para <span class="classname">Zend_Tool</span>
                        oferecendo um manifest com a nome de arquivo especial terminando com
                        &quot;Manifest.php&quot;. Um Provider Manifest é uma implementação do
                        <span class="interface">Zend_Tool_Framework_Manifest_ProviderManifestable</span>
                        e requer o método  <span class="methodname">getProviders()</span> para retornar
                        uma array providers instânciados. Em antecipação do seu primeiro próprio
                        provider <span class="classname">My_Component_HelloProvider</span> nós iremos
                        criar o seguinte manifest:
                    </p></div>

                    <pre class="programlisting brush: php">
class My_Component_Manifest
    implements Zend_Tool_Framework_Manifest_ProviderManifestable
{
    public function getProviders()
    {
        return array(
            new My_Component_HelloProvider()
        );
    }
}
</pre>

                </div>
            </div>

            <div class="section" id="zend.tool.extending.zend-tool-framework.providers-and-manifests.basic"><div class="info"><h1 class="title">Instruções Básicas para Criação de Providers</h1></div>
                

                <p class="para">
                   Como um exemplo, se um desenvolvedor quer adicionar a capacidade de apresentar
                   a versão de um arquivos de dados que seu componente de terceiros está usando,
                   exite apenas uma classe que o desenvolvedor precisaria implementar.
                   Asumindo que o componente é chamado <span class="classname">My_Component</span>,
                   Ele poderia criar uma classe chamada <span class="classname">My_Component_HelloProvider</span>
                   em um arquivo nomeado de <var class="filename">HelloProvider.php</var> em algum lugar no
                   <span class="property">include_path</span>. Esta classe implementaria <span class="classname">Zend_Tool_Framework_Provider_Interface</span>,
                   e o corpo deste arquivo apenas teria que parecer com o seguinte:
                </p>

                <pre class="programlisting brush: php">
class My_Component_HelloProvider
    implements Zend_Tool_Framework_Provider_Interface
{
    public function say()
    {
        echo &#039;Hello from my provider!&#039;;
    }
}
</pre>


                <p class="para">
                    Dado o códifo acima, e assumindo que o desenvolvedor deseja acessar
                    esta funcionalidade através do cliente de console, a chamada se pareceria
                    com isto:
                </p>

                <pre class="programlisting brush: sh">
% zf say hello
Hello from my provider!
</pre>

            </div>

            <div class="section" id="zend.tool.extending.zend-tool-framework.providers-and-manifests.response"><div class="info"><h1 class="title">O objeto response</h1></div>
                

                <p class="para">
                    Como assumido na arquitetura da sessão <span class="classname">Zend_Tool</span> permite
                    unir diferentes cliente para usar o seus providers <span class="classname">Zend_Tool</span>.
                    Para manter a conformidade com diferentes clientes você deve usar o objeto de resposta
                    para retornar mensagens de seus providers em vez de usar  <span class="methodname">echo()</span>
                    ou um mecanismo de saída semelhante. Reescrevendo nosso provider hello com este conhecimento
                    isto vai se parecer com:
                </p>

                <pre class="programlisting brush: php">
class My_Component_HelloProvider
    extends Zend_Tool_Framework_Provider_Abstract
{
    public function say()
    {
        $this-&gt;_registry
             -&gt;getResponse()
             -&gt;appendContent(&quot;Hello from my provider!&quot;);
    }
}
</pre>


                <p class="para">
                    Como você pode ser ele extende o
                    <span class="classname">Zend_Tool_Framework_Provider_Abstract</span> para ter acesso
                    ao Registry que guarda a instância do <span class="classname">Zend_Tool_Framework_Client_Response</span>.
                </p>
            </div>

            <div class="section" id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced"><div class="info"><h1 class="title">Informações sobre Desenvolvimento Avançado</h1></div>
                

                <div class="section" id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.variables"><div class="info"><h1 class="title">Passando variáveis para o Provider</h1></div>
                    

                    <p class="para">
                        O exemplo &quot;Hello World&quot; acima é ótimo para comandos simples, mas
                        o que dizer sobre algo mais avançado? Como seu script e ferramentas
                        necessitam crescer, você pode achar que precisa da capacidade de aceitar
                        variáveis. Bem como assinaturas de função têm parâmetros, a sua
                        chamada para a ferramenta também podem aceitar parâmetros.
                    </p>

                    <p class="para">
                        Assim como cada requisição à ferramenta podem ser isolado a um método
                        dentro de uma classe, os parâmetros de uma requisição à ferramenta
                        também podem ser isolado em um lugar muito conhecido. Parâmetros dos
                        métodos de ação de um provider podem incluir os mesmos parâmetros que
                        você deseja que o seu cliente utilize ao chamar o provider e combinação
                        de ações. Por exemplo, se você quiser aceitar um nome no exemplo acima,
                        você provavelmente fazer isso em um código OO:
                    </p>

                    <pre class="programlisting brush: php">
class My_Component_HelloProvider
    implements Zend_Tool_Framework_Provider_Interface
{
    public function say($name = &#039;Ralph&#039;)
    {
        echo &#039;Hello&#039; . $name . &#039;, from my provider!&#039;;
    }
}
</pre>


                    <p class="para">
                        O exemplo acima pode então ser chamado via linha de comando
                        <strong class="command">zf say hello Joe</strong>. &quot;Joe&quot; será fornecido ao provider
                        como um parametro do método chamado. Também note, como pode ser que o
                        parametro é opcional, isto significa que ele é também opcional na linha
                        de comando, assim <strong class="command">zf say hello</strong> ainda funcionará, e
                        por padrão o nome será &quot;Ralph&quot;.
                    </p>
                </div>

                <div class="section" id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.prompt"><div class="info"><h1 class="title">Solicitar Entrada ao Usuário</h1></div>
                    

                    <p class="para">
                        Existem casos quando o workflow do seu provider requer
                        solicitar o usuário entrada de dados. Isto pode ser feito,
                        solicitando o cliente a pedir mais entradas necessárias chamando:
                    </p>

                    <pre class="programlisting brush: php">
class My_Component_HelloProvider
    extends Zend_Tool_Framework_Provider_Abstract
{
    public function say($name = &#039;Ralph&#039;)
    {
        $nameResponse = $this-&gt;_registry
                             -&gt;getClient()
                             -&gt;promptInteractiveInput(&quot;Whats your name?&quot;);
        $name = $nameResponse-&gt;getContent();

        echo &#039;Hello&#039; . $name . &#039;, from my provider!&#039;;
    }
}
</pre>


                    <p class="para">
                        Este comando dispara uma exceção se o cliente corrente não é
                        capaz de manipular requisições interativas. No caso de o Cliente do Console
                        padrão, contudo, você será solicitado a digitar o nome.
                    </p>
                </div>

                <div class="section" id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.pretendable"><div class="info"><h1 class="title">Fingindo para executar um Provider Action</h1></div>
                    

                    <p class="para">
                        Outra funcionalidade interessante que você pode desejar implementar
                        é <em class="emphasis">fingimento</em>. Fingimento é a capacidade de seu
                        provedor para &quot;fingir&quot; como se estivesse fazendo a ação solicitada e
                        combinação de provedor e dar ao usuário o máximo de informações sobre
                        o que <em class="emphasis">faria</em> sem realmente fazesse. Isso pode
                        ser uma noção importante ao fazer banco de dados pesado ​​ou modificações
                        do sistema de arquivos que o usuário não poderiam querer fazer.
                    </p>

                    <p class="para">
                        Fingimento é fácil de implementar. Existem duas partes para esta
                        funcionalidade: 1) marcando o provider como tendo a habilidade para
                        &quot;fingir&quot;, e 2) verificando a requisição para garantir a requisição
                        corrente foi de fato solicitada a ser &quot;pretended&quot;. Esta funcionalidade
                        é demostrada no simples código abaixo.
                    </p>

                    <pre class="programlisting brush: php">
class My_Component_HelloProvider
    extends    Zend_Tool_Framework_Provider_Abstract
    implements Zend_Tool_Framework_Provider_Pretendable
{
    public function say($name = &#039;Ralph&#039;)
    {
        if ($this-&gt;_registry-&gt;getRequest()-&gt;isPretend()) {
            echo &#039;I would say hello to &#039; . $name . &#039;.&#039;;
        } else {
            echo &#039;Hello&#039; . $name . &#039;, from my provider!&#039;;
        }
    }
}
</pre>


                    <p class="para">
                        Para rodar o provider em modo fingido apenas chame:
                    </p>

                    <pre class="programlisting brush: sh">
% zf --pretend say hello Ralph
I would say hello Ralph.
</pre>

                </div>

                <div class="section" id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.verbosedebug"><div class="info"><h1 class="title">Modos Verboso e Debug</h1></div>
                    

                    <p class="para">
                        Você pode também rodar as suas actions do provider em modo &quot;verboso&quot; ou &quot;debug&quot;.
                        A semântica em relação a esta ações devem ser implementadas por você
                        no contexto do seu provedor. Você pode acessar o modo debug ou verboso com:
                    </p>

                    <pre class="programlisting brush: php">
class My_Component_HelloProvider
    implements Zend_Tool_Framework_Provider_Interface
{
    public function say($name = &#039;Ralph&#039;)
    {
        if($this-&gt;_registry-&gt;getRequest()-&gt;isVerbose()) {
            echo &quot;Hello::say has been called\n&quot;;
        }
        if($this-&gt;_registry-&gt;getRequest()-&gt;isDebug()) {
            syslog(LOG_INFO, &quot;Hello::say has been called\n&quot;);
        }
    }
}
</pre>

                </div>

                <div class="section" id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.configstorage"><div class="info"><h1 class="title">Acessando Configuração e Armazenamento de Usuário</h1></div>
                    

                    <p class="para">
                        Usando a variável de Ambiente <span class="property">ZF_CONFIG_FILE</span> ou o
                        .zf.ini em seu diretório home você pode injetar parametros configuração em
                        qualquer provider <span class="classname">Zend_Tool</span>. Acesso a esta configuração
                        está disponível via registry que é passado para seu provider se você extender
                        <span class="classname">Zend_Tool_Framework_Provider_Abstract</span>.
                    </p>

                    <pre class="programlisting brush: php">
class My_Component_HelloProvider
    extends Zend_Tool_Framework_Provider_Abstract
{
    public function say()
    {
        $username = $this-&gt;_registry-&gt;getConfig()-&gt;username;
        if(!empty($username)) {
            echo &quot;Hello $username!&quot;;
        } else {
            echo &quot;Hello!&quot;;
        }
    }
}
</pre>


                    <p class="para">
                        A configuração retornada está no tipo
                        <span class="classname">Zend_Tool_Framework_Client_Config</span> mas internamente os
                        métodos mágicos  <span class="methodname">__get()</span> and  <span class="methodname">__set()</span>
                        encaminham para um <span class="classname">Zend_Config</span> do tipo de configuração
                        fornecida.
                    </p>

                    <p class="para">
                        O armazenamento permite salvar dados arbitrarios para referenciar depois.
                        Isto pode ser útil para tarefas de processamento em lote ou para re-executar
                        sua tarefa. Você pode acessar o armazenamento em uma caminho similar ao
                        da configuração:
                    </p>

                    <pre class="programlisting brush: php">
class My_Component_HelloProvider
    extends Zend_Tool_Framework_Provider_Abstract
{
    public function say()
    {
        $aValue = $this-&gt;_registry-&gt;getStorage()-&gt;get(&quot;myUsername&quot;);
        echo &quot;Hello $aValue!&quot;;
    }
}
</pre>


                    <p class="para">
                        A <acronym class="acronym">API</acronym> para o armazenamento é muito simples:
                    </p>

                    <pre class="programlisting brush: php">
class Zend_Tool_Framework_Client_Storage
{
    public function setAdapter($adapter);
    public function isEnabled();
    public function put($name, $value);
    public function get($name, $defaultValue=null);
    public function has($name);
    public function remove($name);
    public function getStreamUri($name);
}
</pre>


                    <div class="important"><b class="important">Important</b>
                        <p class="para">
                            Ao projetar seus providers que estarão cientes do armazenamento e da
                            configuração lembre-se de verificar se configurações de usuário ou
                            chaves de armazenamento necessárias realmente existem para um usuário.
                            Você não vai executar em erros fatais quando nenhuma dessas existir
                            porém, desde que eles estejam vazios, são criados mediante solicitação.
                        </p>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <div class="section" id="zend.tool.extending.zend-tool-project"><div class="info"><h1 class="title">Extensões Zend_Tool_Project</h1></div>
        

        <p class="para">
            <span class="classname">Zend_Tool_Project</span> expoe um rico conjunto de funcionalidades e
            capacidades que faz o tarefa de criação de novos providers, especificamente visando
            projetos mais fáceis e mais gerenciáveis.
        </p>

        <div class="section" id="zend.tool.extending.zend-tool-project.architecture"><div class="info"><h1 class="title">Arquitetura Geral</h1></div>
            

            <p class="para">
                Este mesmo conceito se aplica aos projetos Zend Framework. Em projetos de Zend Framework,
                você tem controllers, actions, views, models, bancos de dados e assim por diante. Em
                Termos de <span class="classname">Zend_Tool</span>, nós precisamos de um caminho para rastrear
                estes tipos de recursos - portanto <span class="classname">Zend_Tool_Project</span>.
            </p>

            <p class="para">
                <span class="classname">Zend_Tool_Project</span> é capaz de rastrear os recursos do projeto
                ao longo do desenvolvimento de um projeto. Então, por exemplo, se em um comando você
                criar um controller, e no próximo comando você quiser criar uma action sem o controller,
                <span class="classname">Zend_Tool_Project</span> vai ter de <em class="emphasis">saber</em>
                sobre o arquivo controller que você criou de modo que você pode (na próxima ação),
                ser capaz de acrescentar a action a ele. Isto é o que mantém os nossos projetos
                em dia e <em class="emphasis">monitorado</em>.
            </p>

            <p class="para">
                Outro ponto importante para entender é sobre projetos é que tipicamente, recursos
                são organizados em uma forma hierarquica. Com que em mente, <span class="classname">Zend_Tool_Project</span>
                é capaz de serializar o projeto corrente em uma representação interna que permite
                lhe permite acompanhar não só <em class="emphasis">que</em> recursos são parte de um projeto em um dado momento,
                mas também <em class="emphasis">onde</em> eles estão em relação uns aos outros.
            </p>
        </div>


        <div class="section" id="zend.tool.extending.zend-tool-project.providers"><div class="info"><h1 class="title">Criando Providers</h1></div>
            

            <p class="para">
                Providers específicos de projeto são criados da mesma forma como providers de serviços,
                com uma exceção: os providers de projeto devem estender de <span class="classname">Zend_Tool_Project_Provider_Abstract</span>.
                Esta classe vem com algumas funcionalidades significativas que ajudam os desenvolvedores
                a caregar o projeto existente, obter o objeto de profile, e ser capaz de pesquisar o profile,
                e depois armazenar quaisquer alterações ao profile do projeto atual.
            </p>

            <pre class="programlisting brush: php">
class My_Component_HelloProvider
    extends Zend_Tool_Project_Provider_Abstract
{
    public function say()
    {
        $profile = $this-&gt;_loadExistingProfile();

        /* ... do project stuff here */

        $this-&gt;_storeProfile();
    }
}
</pre>

        </div>

        
    </div>
</div>
        <hr />

            <table width="100%">
                <tr>
                    <td width="25%" style="text-align: left;">
                    <a href="zend.tool.usage.cli.html">Usando Zend_Tool na Linha de Comando</a>
                    </td>

                    <td width="50%" style="text-align: center;">
                        <div class="up"><span class="up"><a href="zend.tool.html">Zend_Tool</a></span><br />
                        <span class="home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></span></div>
                    </td>

                    <td width="25%" style="text-align: right;">
                        <div class="next" style="text-align: right; float: right;"><a href="zend.tool.framework.html">Zend_Tool_Framework</a></div>
                    </td>
                </tr>
            </table>
</td>
        <td style="font-size: smaller;" width="15%"> <style type="text/css">
#leftbar {
	float: left;
	width: 186px;
	padding: 5px;
	font-size: smaller;
}
ul.toc {
	margin: 0px 5px 5px 5px;
	padding: 0px;
}
ul.toc li {
	font-size: 85%;
	margin: 1px 0 1px 1px;
	padding: 1px 0 1px 11px;
	list-style-type: none;
	background-repeat: no-repeat;
	background-position: center left;
}
ul.toc li.header {
	font-size: 115%;
	padding: 5px 0px 5px 11px;
	border-bottom: 1px solid #cccccc;
	margin-bottom: 5px;
}
ul.toc li.active {
	font-weight: bold;
}
ul.toc li a {
	text-decoration: none;
}
ul.toc li a:hover {
	text-decoration: underline;
}
</style>
 <ul class="toc">
  <li class="header home"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="manual.html">Guia de Refer&ecirc;ncia do Programador</a></li>
  <li class="header up"><a href="reference.html">Refer&ecirc;ncia do Zend Framework</a></li>
  <li class="header up"><a href="zend.tool.html">Zend_Tool</a></li>
  <li><a href="zend.tool.usage.cli.html">Usando Zend_Tool na Linha de Comando</a></li>
  <li class="active"><a href="zend.tool.extending.html">Extendendo o Zend_Tool</a></li>
 </ul>
 </td>
    </tr>
</table>

<script type="text/javascript" src="../js/shCore.js"></script>
<script type="text/javascript" src="../js/shAutoloader.js"></script>
<script type="text/javascript" src="../js/main.js"></script>

</body>
</html>